/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package monkey;

import com.jme3.app.SimpleApplication;
import com.jme3.bullet.BulletAppState;
import com.jme3.bullet.control.RigidBodyControl;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Sphere;
import view.ProjeteisPanelView;

/**
 *
 * @author mathyas
 */

/*
 * Simula o movimento de projéteis.
 * Em essência um corpo pode ser arremessado em qualquer direção
 * levando em consideração massa, velocidade e aceleração
 */
public class ProjeteisMonkey extends SimpleApplication {

    private BulletAppState bulletAppState;
    
    private Sphere corpo;
    private Geometry geometryCorpo;
    private RigidBodyControl bodyControlCorpo;
    
    private Box chao;
    private Geometry geometryChao;
    private RigidBodyControl bodyControlChao;
    
    private ProjeteisPanelView panel;
    

    public ProjeteisMonkey(ProjeteisPanelView panel) {
        this.panel = panel;
    }
    
    
    
    @Override
    public void simpleInitApp() {
        // ativa janela do game apenas com mouse-arrasta
        flyCam.setDragToRotate(true);

        //Altera velocidade da camera
        flyCam.setMoveSpeed(5f);

        //Inicia core de 
        bulletAppState = new BulletAppState();
        stateManager.attach(bulletAppState);

        iniciarChao();
        iniciarCorpo();
        
    }

    @Override
    public void update() {
        super.update();
        Vector3f vf = geometryCorpo.getLocalTranslation();
        panel.getjLabelPontoX().setText(Float.toString(vf.x));
        panel.getjLabelPontoY().setText(Float.toString(vf.y));
    }
    
    

    /*
     * Inicia o chão do ambiente
     */
    private void iniciarChao() {
        chao = new Box(Vector3f.ZERO, 100f, 0.1f, 100f);
        geometryChao = new Geometry("Chao", chao);
        Material chaoMaterial = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        chaoMaterial.setColor("Color", ColorRGBA.Gray);
        geometryChao.setMaterial(chaoMaterial);
        geometryChao.setLocalTranslation(0,-5f, 0);
        this.rootNode.attachChild(geometryChao);
        
        //aplica física ao chão com gravidade 0. ou seja, o corpo não se move
        bodyControlChao = new RigidBodyControl(0.0f);
        geometryChao.addControl(bodyControlChao);
        bulletAppState.getPhysicsSpace().add(bodyControlChao);
    }

    private void iniciarCorpo() {
        corpo = new Sphere(32, 32, 0.4f, true, false);
        geometryCorpo = new Geometry("bola", corpo);
        corpo.setTextureMode(Sphere.TextureMode.Projected);
        Material materialCorpo = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        materialCorpo.setColor("Color", ColorRGBA.Red);
        geometryCorpo.setMaterial(materialCorpo);
        geometryCorpo.setLocalTranslation(0, 0, 0);
        rootNode.attachChild(geometryCorpo);
        
        bodyControlCorpo = new RigidBodyControl(1f);
        geometryCorpo.addControl(bodyControlCorpo);
        bulletAppState.getPhysicsSpace().add(bodyControlCorpo);
    }

    /*
     * Configura uma posição para o corpo
     */
    public void setPosicaoCorpo(float x, float y, float z) {
        geometryCorpo.setLocalTranslation(x, y, z);
    }

    /*
     * Configura velocidade do corpo.
     * Esta velocidade pode sofrer ação da gravidade.
     */
    public void setVelocidadeCorpo(float x, float y, float z) {
        bodyControlCorpo.setLinearVelocity(new Vector3f(x, y, z));
    }

    /*
     * Configura aceleração do corpo
     */
    public void setAceleracaoCorpo(float x, float y, float z) {
        bodyControlCorpo.setGravity(new Vector3f(x, y, z));
    }
    
    /*
     * Configura massa do corpo
     */
    public void setMassa(float massa) {
        bodyControlCorpo.setMass(massa);
    }
    
    public void resetCorpo() {
        bodyControlCorpo.setMass(0);
        bodyControlCorpo.setLinearVelocity(Vector3f.ZERO);
        bodyControlCorpo.setGravity(Vector3f.ZERO);
        geometryCorpo.setLocalTranslation(0, 0, 0);
    }
    
    
    
    
    public static void main(String[] args) {
        ProjeteisMonkey app = new ProjeteisMonkey(null);
        app.start();
    }

}
